package com.zhangshanfeng.test;

/*
同步方法、同步代码块、同步静态方法锁对象
 */
public class MyRunnable implements Runnable {
    private static int ticketCount = 100;//100张票

    @Override
    public void run() {
        //1.同步方法
        while (true) {
            if ("窗口一".equals(Thread.currentThread().getName())) {
                boolean result = synchronizedMethod();
                if (result) {
                    break;
                }
            }

            //2.同步代码块
            if("窗口二".equals(Thread.currentThread().getName())){

                //同步方法的锁对象是什么呢?
                //
                //​	this

                //同步静态方法的锁对象是什么呢?
                //
                //​	类名.class
                //重点是要使用同一把锁，1.静态同步方法锁对象是类名.方法---另一个静态代码块的锁要和他保持一致
                //2.普通同步方法的锁对象是this，-----另一个静态代码块的锁对象要使用一致的this//否则会报错
                synchronized (MyRunnable.class){//是否可以换成其他的


                   if(ticketCount == 0){
                       break;
                   } else {
                       try {
                           Thread.sleep(10);
                       } catch (InterruptedException e) {
                           e.printStackTrace();
                       }
                       ticketCount--;
                       System.out.println(Thread.currentThread().getName() + "剩余" + ticketCount);
                   }

                }

            }

        }

    }




    public static synchronized boolean synchronizedMethod() {
        //没票就不卖了返回一个值
        if (ticketCount == 0) {
            return true;
        } else {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            ticketCount--;
            System.out.println(Thread.currentThread().getName() + "剩余" + ticketCount);
            return false;
        }


    }

}

class Demo{
    public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t = new Thread(mr,"窗口一");
        Thread t2 = new Thread(mr,"窗口二");
        t.start();
        t2.start();



    }

}
